package com.group5.controller;


import com.group5.dao.PlatformMapper;
import com.group5.dao.UserssMapper;
import com.group5.pojo.Platform;
import com.group5.pojo.Userss;
import com.group5.service.Md5Util;
import com.group5.service.RegisterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


//注册使用的Controller，url为210.30.97.103:20305/register/*
@RestController
@RequestMapping("/register")
public class RegisterController {

    @Autowired
    UserssMapper userssMapper;
    @Autowired
    PlatformMapper platformMapper;

    RegisterService registerService = new RegisterService();

    /***
     * 判断数据库中是否有该用户，防止重名
     * @param username
     * @return 1代表重复，需要重新输入username，0代表不重复，可以进行注册
     */
    @GetMapping("/users")
    public boolean isUserNameDuplication(@RequestParam String username) {
        List<Userss> usersses = userssMapper.selectByExample(registerService.selectUserByUserNameExample(username));
        return !usersses.isEmpty();
    }

    /**
     * 从前端获取一个用户的信息，添加到数据库中
     *
     * @param userss 从前端获取user的注册信息
     * @return 数据库返回的信息
     */

//    {
//        "user_name": "李铭宇",
//            "password": "lmy123",
//            "question": "你是谁",
//            "answer": "李铭宇"
//    }

    @PostMapping("/users")
    public int insert(@RequestBody Userss userss) {
        registerService.initUser(userss);
        return userssMapper.insert(registerService.MD5UserPasswordAndSalt(userss));
    }

    //TODO:上面两个方法注册的用户，只是临时角色，oid为空，下面需用户注册机构并成为管理员，或者加入到一个已有的机构


    /**
     * 判断数据库中是否有该平台，防止重名
     *
     * @param oname
     * @return 1代表重复，需要重新输入oname，0代表不重复，可以进行注册
     */

    @GetMapping("/platforms")
    public boolean isPlatformNameDuplication(@RequestParam String oname) {
        List<Platform> platforms = platformMapper.selectByExample(registerService.selectPlatformByONameExample(oname));
        return !platforms.isEmpty();
    }

    /**
     * 判断数据库中是否有该平台的助记码
     *
     * @param omnemonics_code
     * @return 1代表重复，需要重新输入助记码，0代表不重复，可以进行注册
     */

    @GetMapping("/platforms/omnemonics_code")
    public boolean isPlatformOmnemonics_codeDuplication(@RequestParam String omnemonics_code) {
        List<Platform> platforms = platformMapper.selectByExample(registerService.selectPlatformByOmnemonics_codeExample(omnemonics_code));
        return !platforms.isEmpty();
    }

    /**
     * 从前端获取一个机构的信息，添加到数据库中，前端需要为对象添加机构名称、助记码、一个机构类型（将其中一个.*_state设置为2或1）。
     * 数据库添加机构后，需要将申请人的oid设置为该机构的oid
     *
     * @param
     * @return
     */

    //已测试,有默认值的可以不填,下面是一个测试用例,没有默认值也不自增,即必填的的只有oname,omnemonics_code和某一个.*_state
    //uid=10000027
//    {
//    "oname": "李铭宇创建的公司",
//    "omnemonics_code": 9999999,
//    "seller_state": 2
//}
    @PutMapping("/platforms")
    public int insertPlatform(@RequestParam String oname, @RequestParam String omnemonics_code,@RequestParam String type, @RequestParam String username) {
        Platform platform = new Platform();
        platform.setOname(oname);
        platform.setOmnemonics_code(omnemonics_code);
        if(type.equals("buyer")){
            platform.setBuyer_state(2);
        }
        else if(type.equals("seller")){
            platform.setSeller_state(2);
        }
        else if(type.equals("manufacturer")){
            platform.setManufacturer_state(2);
        }
        registerService.initPlatform(platform);
        int InsertPlatform = platformMapper.insert(platform);
        int oid = platformMapper.selectByExample(registerService.selectPlatformByONameExample(platform.getOname())).get(0).getOid();
        Userss userss = userssMapper.selectByExample(registerService.selectUserByUserNameExample(username)).get(0);
        userss.setOid(oid);
        userssMapper.updateByPrimaryKeySelective(userss);
        return InsertPlatform;
    }


    /**
     * 获取某个用户的机构申请草稿（未通过也是草稿）
     *
     * @param uid
     * @return
     */

    @GetMapping("/platforms/draft")
    @ResponseBody
    public Platform PlatformDraft(@RequestParam int uid){
        Platform platform=platformMapper.selectByPrimaryKey(userssMapper.selectByPrimaryKey(uid).getOid());
        if(registerService.isDraft(platform))
            return platform;
        else return null;
    }

    /**
     * 前端选择将草稿提交审核所需要的方法，将用户提交审核的机构的.*_state改为2
     * @param uid
     * @return
     */
    @PostMapping("/platforms/draft")
    public int PlatformDraftToUnaudited(@RequestParam int uid){
        Platform platform=platformMapper.selectByPrimaryKey(userssMapper.selectByPrimaryKey(uid).getOid());
        registerService.setDraftToUnaudited(platform);
        return platformMapper.updateByPrimaryKeySelective(platform);
    }


    /**
     * user申请加入加入已有的平台机构,用户申请阶段
     * 前端用户选择想申请的机构oid,和对应身份
     * 设置user库中user_authority变量为身份的编码，oid为所选择的oid，等待机构管理员审核

     * @param
     *
     */
    @PutMapping("/selectedplatform")
    public int waitingForReview(@RequestParam String oname,@RequestParam String username,@RequestParam String authority)
    {
        Userss userss=userssMapper.selectByExample(registerService.selectUserByUserNameExample(username)).get(0);
        if (userss == null)
            return 0;
        userss.setOid(platformMapper.selectByExample(registerService.selectPlatformByONameExample(oname)).get(0).getOid());

        userss.setUser_authority(registerService.getAuthAuthorityCodeByString(authority));
        return userssMapper.updateByPrimaryKeySelective(userss);
    }

    /**
     * 根据oid的类型，返回用户可以选择的身份
     *      卖方：开票员、业务员；
     *      买方：业务员；
     *      厂商：厂商原则上不需要员工，所以现在会返回null
     * @param oname
     * @return
     */
    @GetMapping("/state")
    public List<RegisterService.AuthorityString> AllAuthorityByOid(@RequestParam String oname){
        Platform platform=platformMapper.selectByExample(registerService.selectPlatformByONameExample(oname)).get(0);
        return registerService.getAllAuthorityByPlatform(platform);
    }

}


